package cn.me.sso.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
/**
 * @author zchcpywin10
 */
@Configuration
@EnableResourceServer
@Order(3)
public class SsoResourceConfig extends ResourceServerConfigurerAdapter {
  @Override
  public void configure(HttpSecurity http) throws Exception {
    //
    //        http
    //                .authorizeRequests()
    //                .antMatchers(
    //                        "/",
    //                        "/Login**",
    //                        "/login**",
    //                        "/LoginCheck**",
    //                        "/home/**",
    //                        "/Home/**",
    //                        "/Logout**"
    //                )
    //                .permitAll()
    //                .and()
    //                .authorizeRequests()
    //                .anyRequest()
    //                .authenticated()
    //                .and()
    //                .logout()
    //                .logoutUrl("/Logout")
    //                .deleteCookies("JSESSIONID")
    //                .logoutSuccessUrl("/Login?logoutOk")
    //                .invalidateHttpSession(true)
    //                .permitAll();
    /**
     注意：
     1、必须先加上 .requestMatchers().antMatchers(...)，表示对资源进行保护，也就是说，在访问前要进行OAuth认证。
     2、接着：访问受保护的资源时，要具有哪里权限。
     ------------------------------------
     否则，请求只是被Security的拦截器拦截，请求根本到不了OAuth2的拦截器。
     同时，还要注意先配置：security.oauth2.resource.filter-order=3，否则通过access_token取不到用户信息。
     ------------------------------------
     requestMatchers()部分说明：
     Invoking requestMatchers() will not override previous invocations of ::
     mvcMatcher(String)}, requestMatchers(), antMatcher(String), regexMatcher(String),
     and requestMatcher(RequestMatcher).
     */
    http
      // Since we want the protected resources to be accessible in the UI as well we need
      // session creation to be allowed (it's disabled by default in 2.0.6)
      //另外，如果不设置，那么在通过浏览器访问被保护的任何资源时，每次是不同的SessionID，
      // 并且将每次请求的历史都记录在OAuth2Authentication的details的中
      .sessionManagement()
      //
      .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
      //
      .and().requestMatchers().antMatchers("/user/*", "/res/**")
      //
      .and().authorizeRequests().antMatchers("/user/*", "/res/**")
      //
      .authenticated();
  }
}
